//
//  HSMessageController.swift
//  Home_School_08
//
//  Created by 张晓林 on 2016/12/22.
//  Copyright © 2016年 张晓林. All rights reserved.
//

import UIKit

class HSMessageController: UITableViewController {
    // 使用列表视图模型加载数据
    fileprivate let messageListVM = HSMessageListViewModel()
    // 回复内容输入框属性
    var inputTextF: UITextField?
    // 输入工具条属性
    var replayInputToolBar: UIView?
    // 记录当前点击按钮对应cell的属性
    var currentCell = HSMessageCell()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.register(UINib.init(nibName: "HSMessageCell", bundle: nil), forCellReuseIdentifier: "messageCell")
        
        tableView.estimatedRowHeight = 350
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.separatorStyle = .none
        
        // 添加右上角发布消息按钮
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "release_msg", target: self, action: #selector(releaseInfoBtnClicked))
        
        downloadData()
        
        // 注册通知，监听键盘弹出
        NotificationCenter.default.addObserver(self, selector: #selector(keybordNotifacation(notify:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
    }
    
    // 设置回复输入工具条
    func setupReplayInputToolBar() {
        // 创建输入工具条
        replayInputToolBar = UIView(frame: CGRect(x: 0, y: screenH, width: screenW, height: 44))
        replayInputToolBar?.backgroundColor = UIColor.colorWithHex(hexColor: 0xf0f0f0)
        // 创建文本输入框
        inputTextF = UITextField(frame: CGRect(x: 8, y: 2, width: screenW - 52, height: 40))
        inputTextF?.placeholder = "回复就是一种鼓励!"
        inputTextF?.borderStyle = .roundedRect
        replayInputToolBar?.addSubview(inputTextF!)
        // 确定按钮
        let suerBtn = UIButton(type: .system)
        suerBtn.frame = CGRect(x: screenW - 44, y: 0, width: 44, height: 44)
        suerBtn.setTitle("确定", for: .normal)
        suerBtn.setTitleColor(UIColor.colorWithHex(hexColor: 0x00a0e9), for: .normal)
        suerBtn.addTarget(self, action: #selector(replaySuerBtnClicked), for: .touchUpInside)
        replayInputToolBar?.addSubview(suerBtn)
        // 添加到窗口视图
        UIApplication.shared.keyWindow?.addSubview(replayInputToolBar!)
    }
    
    // 加载数据
    func downloadData() {
        messageListVM.loadData {[weak self] (isRefresh) in
            if isRefresh {
                self?.tableView.reloadData()
            }
        }
    }
    
    // 发布按钮的回调方法
    @objc private func releaseInfoBtnClicked() {
        // 退出键盘
        endKeybord()
        // 跳转到发布页面
        navigationController?.pushViewController(HSReleaseInfoController(), animated: true)
    }

}

//MARK: - 表格视图的数据源和代理
extension HSMessageController {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return messageListVM.messageModels.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell", for: indexPath) as! HSMessageCell
        cell.selectionStyle = .none
        // 获得对应的模型
        let messageVM = messageListVM.messageModels[indexPath.row]
        cell.messageVM = messageVM
        
        // 相应cell的事件回调
        cell.likeBtnBlock = {[weak self](clickCell) in
            self?.likeBtnClicked(clickCell)
        }
        
        cell.replayBtnBlock = {[weak self](clickCell) in
            self?.replayBtnClicked(clickCell)
        }
        return cell
    }
    
    // 拖动表格视图的代理方法
    override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        if scrollView == tableView {
            endKeybord()
        }
    }
    
    // 退出键盘
    func endKeybord() {
        // 退出键盘
        inputTextF?.resignFirstResponder()
    }
}

//MARK: - 点赞和回复相关功能实现代码
extension HSMessageController {
    
    //MARK: 1.回复功能方法封装
    func replayBtnClicked(_ cell: HSMessageCell) {
        // 记录当前cell,用于通知回调方法中计算cell的位置
        currentCell = cell
        
        if replayInputToolBar == nil || replayInputToolBar?.superview == nil {
            // 当点击回复按钮时才添加输入工具条
            setupReplayInputToolBar()
            // 设置文本输入框为第一响应者
            inputTextF?.becomeFirstResponder()
        }
    }
    
    //MARK: 键盘监听通知的回调方法
    func keybordNotifacation(notify: Notification) {
        // 获得键盘对应的frame
       guard let keybordFrame = notify.userInfo?["UIKeyboardFrameEndUserInfoKey"] as? CGRect else {
            return
        }
        
        // 获得键盘Y
        let keybordY = keybordFrame.minY
        // 根据键盘位置设置输入工具条位置
        replayInputToolBar?.center = CGPoint(x: screenW/2, y: keybordY - 22)
        // 判断当前位置
        if keybordY == screenH {
            replayInputToolBar?.removeFromSuperview()
        }
        
        // 设置表格视图自动设备键盘高度
        // 获得窗口视图
        guard let keyWindow = UIApplication.shared.keyWindow else {
            return
        }
        // 获得cell对应窗口的frame
        let rect = keyWindow.convert(currentCell.frame, from: tableView)
        // 获得当前cell的偏移量
        let offset = rect.maxY - (keybordY - 44)
        if offset <= 0 {
            return
        }
        // 获得表格视图当前偏移量
        let currentOffsetY = tableView.contentOffset.y
        // 重新设置表格视图的偏移量
        let newOffsetP = CGPoint(x: 0, y: currentOffsetY + offset)
        tableView.setContentOffset(newOffsetP, animated: true)
    }
    
    //MARK: 1.1回复内容确定按钮的监听回调事件方法
    func replaySuerBtnClicked() {
        // 退出键盘
        endKeybord()
        // 获得当前cell对应的视图模型
        guard let messageVM = currentCell.messageVM else {
            return
        }
        // 获得回复接口
        let replayUrl = "ZH-schoolname-S-submitJXReplay"
        // 获得通知ID
        let notify_ID = messageVM.message.not_id
        // 获得输入的回复内容
        guard let replayCont = inputTextF?.text,inputTextF?.text != "" else {
            HSAlertView.bottomAlertView("回复内容不能为空")
            return
        }
        // 设置参数
        let parm: [String: Any] = ["key":userID,"id":notify_ID,"content":replayCont,"user_type":2]
        // 上传到服务器
        HSNetworkTools.shared.request(url: replayUrl, parameters: parm) { (data, err) in
            
            guard let data = data as? NSDictionary,let dictArray = data["data"] as? [[String: Any]] else {
                HSAlertView.bottomAlertView("回复数据加载异常")
                return
            }
            
            // 创建一个保存回复模型的数组
            var replayModels = [HSReplayListModel]()
            for dict in dictArray {
                // 初始化模型
                let model = HSReplayListModel(dict: dict)
                replayModels.append(model)
            }
            
            // 获得当前消息模型
            let newMessage = messageVM.message
            newMessage.replaylist = replayModels
            // 从新赋值，触发富文本属性设置
            messageVM.message = newMessage
            // 刷新表格视图
            self.tableView.reloadData()
        }
    }
    
    //MARK: 2.点赞按钮功能
    func likeBtnClicked(_ cell: HSMessageCell) {
        // 获得当前cell对应的模型
        // 判断当前用户是否已经点赞
        guard let messageVM = cell.messageVM,
            let likeListStr = messageVM.message.likelist,
            // 获得当前用户名
            let userName = userInfo["studentName"] as? String
            else {
                return
        }
        
        let rang = (likeListStr as NSString).range(of: "\(userName) 家长")
        print(rang.length)
        if rang.length > 0 {
            HSAlertView.bottomAlertView("已点赞")
            return
        }
        // 获得点赞接口
        let likeUrl = "ZH-schoolname-S-submitJXLike"
        // 通知ID
        let notify_id = messageVM.message.not_id
        // 拼接参数
        let parm:[String: Any] = ["key":userID,"id":notify_id,"user_type":2]
        // 发送点赞请求
        HSNetworkTools.shared.request(url: likeUrl, parameters: parm) { (data, err) in
            guard let dict = data as? NSDictionary,let array = dict["data"] as? NSArray else {
                return
            }
            
            // 获得点赞后的数据
            let likeDict = array[0] as! NSDictionary
            
            // 获得当前模型
            let newMessage = messageVM.message
            newMessage.likelist = likeDict["likelist"] as? String
            newMessage.likenum = likeDict["likenum"] as! Int
            messageVM.message = newMessage
            
            // 刷新表格视图
            self.tableView.reloadData()
        }
    }

}








